/**
 * Copyright (C), 2015-2019, XXX有限公司
 * FileName: AbstractProcessor
 * Author:   zhouheng
 * Date:     2019/5/15 10:18
 * Description: 支付处理抽象类
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
package com.star.pay.service.core.processor;

import com.star.pay.service.core.processor.context.PaymentContext;
import lombok.extern.slf4j.Slf4j;

/**
 * 〈一句话功能简述〉<br> 
 * 〈支付处理抽象类〉
 *
 * @author zhouheng
 * @create 2019/5/15
 * @since 1.0.0
 */
@Slf4j
public abstract class AbstractProcessor implements PayProcessor {

    /**
     * @description: 支付处理逻辑
     * @date: 2019/5/15 10:24
     * @author:zhouheng
     */
    @Override
    public void process(PaymentContext paymentContext) {
        try {
            // 1.初始化支付渠道
            initPayChannel(paymentContext);

            // 2.支付请求参数检查
            if (!preCheckContext(paymentContext)){
                return;
            }

            // 3.处理支付请求
            boolean result = processTransaction(paymentContext);

            log.info("支付处理结果：{},支付订单号{}",result);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 清除订单支付信息
            clean(paymentContext);
        }
    }

    /**
     * @description: 清除订单支付信息
     * @date: 2019/5/15 11:13
     * @author:zhouheng
     */
    protected abstract void clean(PaymentContext paymentContext);

    /**
     * @description: 处理支付请求
     * @date: 2019/5/15 10:28
     * @author:zhouheng
     */
    protected abstract boolean processTransaction(PaymentContext paymentContext);

    /**
     * @description: 支付请求参数检查
     * @date: 2019/5/15 10:27
     * @author:zhouheng
     */
    protected abstract boolean preCheckContext(PaymentContext paymentContext);

    /**
     * @description: 初始化支付渠道
     * @date: 2019/5/15 10:27
     * @author:zhouheng
     */
    protected abstract void initPayChannel(PaymentContext paymentContext);

}